#ifndef __FUNCTION_OBJECT_H__
#define __FUNCTION_OBJECT_H__

#include <iostream>

// PrintInt 类，重载了 operator() 函数，使其可以作为函数对象使用
// 该类可以打印整数
class PrintInt {
public:
  void operator()(int i) const;
};

class AddValue {
private:
  int value;

public:
  AddValue(int v);
  void operator()(int &elem) const;
};

template <int value> void add(int &elem);

template <typename T>
void PRINT_ELEMENTS(const T &coll, const std::string &opt_str = " ") {
  std::cout << opt_str;
  for (const auto &elem : coll) {
    std::cout << elem << " ";
  }
  std::cout << std::endl;
}

// 测试函数对象 PrintInt
void function_object();

void template_function_object();

void total_function_object();

void predefined_function_object();

#endif // __FUNCTION_OBJECT_H__